package com.engc.common.fileupload;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.engc.common.utils.BaseUtils;

/**
 * KindEditor 上传
 * 
 * @author ZhixiongGU
 * 
 */
@Controller
public class UploadJson {

	@RequestMapping("/kindEditorUpload")
	@ResponseBody
	public Object kindEditorUpload(HttpServletRequest request)
			throws FileUploadException {
		String savePath = request.getRealPath("/") + "editorfile"
				+ File.separator;
		// 文件保存目录URL
		String saveUrl = request.getContextPath() + "/editorfile/";
		// 定义允许上传的文件扩展名
		HashMap<String, String> extMap = new HashMap<String, String>();
		extMap.put("image", "gif,jpg,jpeg,png,bmp");
		extMap.put("flash", "swf,flv");
		extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
		extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

		// 最大文件大小
		long maxSize = 1000000;
		if (!ServletFileUpload.isMultipartContent(request)) {
			return getError("请选择文件。");
		}
		// 检查目录
		File uploadDir = new File(savePath);
		if (!uploadDir.isDirectory()) {
			return getError("上传目录不存在。");
		}
		// 检查目录写权限
		if (!uploadDir.canWrite()) {
			return getError("上传目录没有写权限。");
		}
		String dirName = request.getParameter("dir");
		if (dirName == null) {
			dirName = "image";
		}
		if (!extMap.containsKey(dirName)) {
			return getError("目录名不正确。");
		}
		// 创建文件夹
		savePath += dirName + "/";
		saveUrl += dirName + "/";
		File saveDirFile = new File(savePath);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdirs();
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(new Date());
		savePath += ymd + "/";
		saveUrl += ymd + "/";
		File dirFile = new File(savePath);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		List items = upload.parseRequest(request);
		Iterator itr = items.iterator();
		while (itr.hasNext()) {
			FileItem item = (FileItem) itr.next();
			String fileName = item.getName();
			long fileSize = item.getSize();
			if (!item.isFormField()) {
				// 检查文件大小
				if (item.getSize() > maxSize) {
					return getError("上传文件大小超过限制。");
				}
				// 检查扩展名
				String fileExt = fileName.substring(
						fileName.lastIndexOf(".") + 1).toLowerCase();
				if (!java.util.Arrays.asList(extMap.get(dirName).split(","))
						.contains(fileExt)) {
					return getError("上传文件扩展名是不允许的扩展名。\n只允许"
							+ extMap.get(dirName) + "格式。");
				}

				SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
				String newFileName = df.format(new Date()) + "_"
						+ new Random().nextInt(1000) + "." + fileExt;
				try {
					File uploadedFile = new File(savePath, newFileName);
					item.write(uploadedFile);
				} catch (Exception e) {
					return getError("上传文件失败。");
				}

				Map<String, Object> obj = new HashMap<String, Object>();
				obj.put("error", 0);
				obj.put("url", saveUrl + newFileName);
				return obj;
			}
		}
		return null;
	}

	/**
	 * 返回图片http服务器地址
	 * 
	 * @param request
	 * @param record
	 *            json map
	 * @param paramname
	 *            参数名
	 * @return
	 * @throws FileUploadException
	 */
	public Map<String, Object> getUploadFile(HttpServletRequest request,
			Map<String, Object> record, String paramname) throws Exception {
		if (record == null) {
			record = new HashMap<String, Object>();
		}
		String savePath = request.getRealPath("/") + "editorfile"
				+ File.separator;
		// 文件保存目录URL
		String saveUrl = request.getContextPath() + "/editorfile/";
		// 定义允许上传的文件扩展名
		HashMap<String, String> extMap = new HashMap<String, String>();
		extMap.put("image", "gif,jpg,jpeg,png,bmp");
		// 最大文件大小
		long maxSize = 10485760;// 10M
		if (!ServletFileUpload.isMultipartContent(request)) {
			return null;
		}
		// 检查目录
		File uploadDir = new File(savePath);
		if (!uploadDir.isDirectory()) {
			return null;
		}
		// 检查目录写权限
		if (!uploadDir.canWrite()) {
			return null;
		}
		String dirName = request.getParameter("dir");
		if (dirName == null) {
			dirName = "image";
		}
		if (!extMap.containsKey(dirName)) {
			return null;
		}
		// 创建文件夹
		savePath += dirName + "/";
		saveUrl += dirName + "/";
		File saveDirFile = new File(savePath);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdirs();
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(new Date());
		savePath += ymd + "/";
		saveUrl += ymd + "/";
		File dirFile = new File(savePath);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		List items = upload.parseRequest(request);
		Iterator itr = items.iterator();
		while (itr.hasNext()) {
			FileItem item = (FileItem) itr.next();
			String fileName = item.getName();
			long fileSize = item.getSize();
			if (!item.isFormField()) {
				// 检查文件大小
				if (item.getSize() > maxSize) {
					record.put(paramname, null);
					continue;
				}
				// 检查扩展名
				String fileExt = fileName.substring(
						fileName.lastIndexOf(".") + 1).toLowerCase();
				if (!java.util.Arrays.asList(extMap.get(dirName).split(","))
						.contains(fileExt)) {

					record.put(paramname, null);
					continue;
				}

				SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
				String newFileName = df.format(new Date()) + "_"
						+ new Random().nextInt(1000) + "." + fileExt;
				File uploadedFile = new File(savePath, newFileName);
				item.write(uploadedFile);
				FileUploadManager fu = new FileUploadManager();
				if (uploadedFile != null) {
					String photo = fu.uploadFile(2, uploadedFile);
					record.put(paramname, photo);
				}
			}
			if (item.isFormField()) {
				// 参数名
				try {
					record.put(item.getFieldName(), item.getString("UTF-8"));
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				// 参数值

			}
		}
		return record;
	}

	/**
	 * 返回多个集合对象
	 * 
	 * @param request
	 * @param record
	 *            json map
	 * @param paramname
	 *            参数名
	 * @return
	 * @throws FileUploadException
	 */
	public Map<String, Object> getBatchUploadFile(HttpServletRequest request,
			Map<String, Object> record, String paramname, String splitFile,
			String splitText) throws Exception {
		Map<String, Object> m = new HashMap<String, Object>();
		// 图片集合
		List<Map<String, Object>> picList = new ArrayList<Map<String, Object>>();
		if (record == null) {
			record = new HashMap<String, Object>();
		}
		String savePath = request.getRealPath("/") + "editorfile"
				+ File.separator;
		// 文件保存目录URL
		String saveUrl = request.getContextPath() + "/editorfile/";
		// 定义允许上传的文件扩展名
		HashMap<String, String> extMap = new HashMap<String, String>();
		extMap.put("image", "gif,jpg,jpeg,png,bmp");
		// 最大文件大小
		long maxSize = 10485760;// 10M
		if (!ServletFileUpload.isMultipartContent(request)) {
			return null;
		}
		// 检查目录
		File uploadDir = new File(savePath);
		if (!uploadDir.isDirectory()) {
			return null;
		}
		// 检查目录写权限
		if (!uploadDir.canWrite()) {
			return null;
		}
		String dirName = request.getParameter("dir");
		if (dirName == null) {
			dirName = "image";
		}
		if (!extMap.containsKey(dirName)) {
			return null;
		}
		// 创建文件夹
		savePath += dirName + "/";
		saveUrl += dirName + "/";
		File saveDirFile = new File(savePath);
		if (!saveDirFile.exists()) {
			saveDirFile.mkdirs();
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String ymd = sdf.format(new Date());
		savePath += ymd + "/";
		saveUrl += ymd + "/";
		File dirFile = new File(savePath);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		List items = upload.parseRequest(request);
		Iterator itr = items.iterator();
		while (itr.hasNext()) {
			FileItem item = (FileItem) itr.next();
			String fileName = item.getName();
			String fName = item.getFieldName();
			long fileSize = item.getSize();
			if (!item.isFormField()) {
				// 检查文件大小
				if (item.getSize() > maxSize) {
					record.put(paramname, null);
					continue;
				}
				// 检查扩展名
				String fileExt = fileName.substring(
						fileName.lastIndexOf(".") + 1).toLowerCase();
				if (!java.util.Arrays.asList(extMap.get(dirName).split(","))
						.contains(fileExt)) {
					record.put(paramname, null);
					continue;
				}

				SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
				String newFileName = df.format(new Date()) + "_"
						+ new Random().nextInt(1000) + "." + fileExt;
				File uploadedFile = new File(savePath, newFileName);
				item.write(uploadedFile);
				FileUploadManager fu = new FileUploadManager();
				
				if (uploadedFile != null) {
					String photo = fu.uploadFile(2, uploadedFile);
					
					if (fName.contains(splitFile)) {
						int index = Integer.parseInt(fName.substring(
								fName.length() - 1, fName.length()));
						String targetKey = splitText + index;
						boolean isSet = false;

						for (int i = 0; i < picList.size(); i++) {
							if (picList.get(i).get(targetKey) != null) {
								picList.get(i).put(fName, photo);
								isSet = true;
							} 
						}
						if(!isSet){
							Map<String, Object> map = new HashMap<String, Object>();
							map.put(fName, photo);
							picList.add(map);
						}
					} else {
						record.put(paramname, photo);
					}
				}
			}
			if (item.isFormField()) {
				// 参数名
				try {
					if (fName.contains(splitText)) {
						int index = Integer.parseInt(fName.substring(
								fName.length() - 1, fName.length()));
						String targetKey = splitFile + index;
						boolean isSet = false;
						
						for (int i = 0; i < picList.size(); i++) {
							if (picList.get(i).get(targetKey) != null) {
								picList.get(i).put(fName,
										item.getString("UTF-8"));
								isSet = true;
							}
						}
						if(!isSet){
							Map<String, Object> map = new HashMap<String, Object>();
							map.put(fName,
									item.getString("UTF-8"));
							picList.add(map);
						}
						
					} else {
						record.put(item.getFieldName(), item.getString("UTF-8"));
					}

				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				// 参数值

			}
		}
		m.put("record", record);
		m.put("secondRecord", picList);
		return m;
	}

	/**
	 * 新增前台图片上传的方法
	 * 
	 * @param request
	 * @return
	 */
	@RequestMapping("uploadPic")
	@ResponseBody
	public Map<String, Object> uploadPic(HttpServletRequest request) {
		try {
			Map result = BaseUtils.getSuccessMessage("上传成功");
			result = getUploadFile(request, result, "url");
			if (result.get("url") == null) {
				result = BaseUtils.getErrorMessage("上传文件格式不正确");
				return result;
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			Map result = BaseUtils.getErrorMessage("上传失败");
			return result;
		}
	}

	public Map<String, Object> getError(String message) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("error", 1);
		map.put("message", message);
		return map;
	}

}
